package com.zmn.plat.services.interfaces.company;

import com.zmn.common.dictionary.DictModel;
import com.zmn.plat.model.entity.company.BaseCompany;
import com.zmn.plat.model.entity.company.BaseCompanyQuery;
import com.zmn.plat.model.entity.company.BaseCompanyTarget;
import com.zmn.plat.model.entity.company.CompanyTypeQuery;
import com.zmn.plat.model.vo.company.BaseCompanyVO;

import java.util.Date;
import java.util.List;

/**
 * @author duanzuocai
 * @version v1.0
 * @类说明：公司服务接口
 * @since 2018/10/16 11:28
 */
public interface BaseCompanyService {

    /**
     * 通过主键查询
     *
     * @param companyId
     * @return
     */
    BaseCompanyVO findByKey(Integer companyId);

    /**
     * 通过平台查询第一个公司
     *
     * @param plat
     * @return
     */
    BaseCompany findOneByPlat(Integer plat);

    /**
     * 通过名称查询
     *
     * @param name
     *            公司名称
     * @return
     */
    BaseCompany findByName(String name);

    /**
     * 公司名称（工商注册名称）查询
     *
     * @param fullName
     *            公司名称
     * @return
     */
    BaseCompany findByFullName(String fullName);

    /**
     * 批量查询
     *
     * @param ids
     * @param type
     * @param status
     * @return
     */
    List<BaseCompany> findByKeys(List<Integer> ids, Integer type, Integer childType, Integer status);

    /**
     * 查询公司
     *
     * @param ids
     * @param companyTypeQueryList
     *            公司类型
     * @param status
     * @return
     */
    List<BaseCompany> findByKeysAndTypes(List<Integer> ids, List<CompanyTypeQuery> companyTypeQueryList, Integer status, Integer plat);

    /**
     * 查询啄木鸟总公司ID
     *
     * @return
     */
    Integer findZmnCompanyId();

    /**
     * 分页查询
     *
     * @param query
     * @return
     */
    List<BaseCompanyVO> listPageByQuery(BaseCompanyQuery query, Integer staffId);

    /**
     * 分页查询，带数据权限
     *
     * @param query
     * @return
     */
    List<BaseCompanyVO> listPageByQueryOfPermit(BaseCompanyQuery query);

    /**
     * 查询列表
     *
     * @param query
     * @return
     */
    List<BaseCompany> listByQuery(BaseCompanyQuery query);

    /**
     * 查询列表：VO
     *
     * @param query
     * @return
     */
    List<BaseCompanyVO> listVOByQuery(BaseCompanyQuery query);

    /**
     * 查询所有公司
     *
     * @return
     */
    List<DictModel> listAll();

    /**
     * 查询所有公司
     *
     * @param companyTypeQueryList
     *            公司类型
     * @return
     */
    List<DictModel> listByTypes(List<CompanyTypeQuery> companyTypeQueryList, Integer plat);

    /**
     * 查询所有公司
     *
     * @param companyTypeQueryList
     *            公司类型
     * @param status
     *            状态
     * @return
     */
    List<DictModel> listByTypesAndStatus(List<CompanyTypeQuery> companyTypeQueryList, Integer status, Integer plat);

    /**
     * 查询公司
     *
     * @param orgIds
     *            组织架构ID
     * @return
     */
    List<BaseCompany> listByOrganIds(List<Integer> orgIds);

    /**
     * 查询公司
     *
     * @param orgIds
     *            组织架构ID
     * @param type
     *            公司类型
     * @return
     */
    List<BaseCompany> listByOrganIds(List<Integer> orgIds, Integer type, Integer childType);

    /**
     * 通过一级组织架构查询第三级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listCompanyByOrganLevelOne(Integer orgId);

    /**
     * 通过一级组织架构查询第四级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listElectricCompanyByOrganLevelOne(Integer orgId);

    /**
     * 通过二级组织架构查询第三级的所有公司
     *
     * @param orgId
     * @return
     */
    List<BaseCompany> listCompanyByOrganLevelTwo(Integer orgId);

    /**
     * 查询公司年度目标
     *
     * @param companyId
     * @param cityId
     * @return
     */
    List<BaseCompanyTarget> listCompanyTarget(Integer companyId, Integer cityId);

    /**
     * 描述: 根据类型，平台标志查询公司信息
     *
     * @param companyTypeQueryList
     *            类型：
     * @param plat
     *            平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    List<BaseCompany> listCompanyByTypes(List<CompanyTypeQuery> companyTypeQueryList, Integer plat);

    /**
     * 描述: 根据类型，平台标志查询公司信息
     *
     * @param companyTypeQueryList
     *            类型：
     * @param plats
     *            平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    List<BaseCompany> listCompanyByTypesAndPlats(List<CompanyTypeQuery> companyTypeQueryList, List<Integer> plats);

    /**
     * 描述: 公司id和状态查询公司信息，mcc数据权限中使用
     *
     * @param query
     *            类型：
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 14:50 2019/6/14
     **/
    List<BaseCompany> listByQueryForMcc(BaseCompanyQuery query);

    /**
     * 描述: 根据修改时间查询大于该时间状态为禁用的数据
     *
     * @param updateTime
     *            修改时间
     * @param companyTypeQueryList
     *            类型
     * @param plat
     *            平台标志：1.言而有信 2.啄木鸟,3川南环保
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 17:26 2019/7/11
     **/
    List<BaseCompanyVO> listCompanyByUpdateTime(Date updateTime, List<CompanyTypeQuery> companyTypeQueryList, Integer plat);

    /**
     * 描述:查询搜索服务商
     *
     * @param query
     *            公司查询对象 plat 平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限 areaId 大区的组织架构Id，Null不限 companyId 子公司Id，Null不限 type 服务商类型，Null不限 (1,7,9) status
     *            服务商状态，1禁用，2启用，Null不限 keyword 服务商名称，支持中文及拼音模糊搜索，Null不限 java.util.List<com.zmn.common.dto.VtDTO> 服务商公司Id、公司名称和状态字段列表
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author wangjie
     * @since 2019/9/5
     **/
    List<BaseCompany> listManageCompanyVtByQuery(BaseCompanyQuery query);

    /**
     * 描述: 查询搜索服务商（bigAreaId，companyId配置在组织架构上的，所以当bigAreaId或者companyId不为空时只查询啄木鸟平台）
     *
     * @param plat
     *            平台标识，1言而有信，2啄木鸟，3一步维修，4川南环保，Null不限
     * @param bigAreaId
     *            大区的组织架构Id，Null不限
     * @param companyId
     *            子公司Id，Null不限
     * @param type
     *            服务商类型，Null不限 (1,7,9)
     * @param status
     *            服务商状态，1禁用，2启用，Null不限
     * @param keyword
     *            服务商名称，支持中文及拼音模糊搜索，Null不限
     * @return BaseCompany 公司完整信息
     **/
    List<BaseCompany> listManageCompany(Integer plat, Integer bigAreaId, Integer companyId, Integer type, Integer childType, Integer status, String keyword);

    /**
     * 描述: 根据平台城市和公式id查询公式Id
     *
     * @param plat
     * @param cityId
     * @param companyId
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author jiafei
     * @since 2021/9/15 21:09
     */
    List<BaseCompany> listByPlatAndCityIdAndCompanyId(Integer plat, Integer cityId, Integer companyId);

    /**
     * 描述: 根据平台城市和公式id查询公式Id
     *
     * @param plat
     * @param companyTypes
     * @return java.util.List<com.zmn.plat.model.entity.company.BaseCompany>
     * @author jiafei
     * @since 2021/9/15 21:09
     */
    List<BaseCompany> listByPlatAndCompanyTypeQuery(Integer plat, List<CompanyTypeQuery> companyTypes);

    /**
     * 统计数量
     *
     * @param query
     * @return
     */
    Integer countByQuery(BaseCompanyQuery query);

    /**
     * 通过主键更新过滤为空的
     *
     * @param company
     * @return
     */
    Integer updateByKeySelective(BaseCompany company);

    /**
     * 通过主键更新
     *
     * @param company
     * @return
     */
    Integer updateByKey(BaseCompany company);

    /**
     * 修改状态
     *
     * @param arrayIds
     * @param status
     * @param mcStaffName
     * @return 是否成功1/0
     */
    int updateStatusBatch(List<Integer> arrayIds, int status, String mcStaffName);

    /**
     * 更新排序
     *
     * @param company
     * @return
     * @author tanbiao 2019/09/06
     */
    Integer updateSortByKey(BaseCompany company);

    /**
     * 更新排序
     *
     * @param companyId
     * @param sort
     * @param mcStaffRealName
     * @return
     * @author tanbiao 2019/09/06
     */
    Integer updateSortByKey(Integer companyId, Integer sort, String mcStaffRealName);

    /**
     * 添加公司
     *
     * @param company
     * @return
     */
    Integer insert(BaseCompany company);

    /**
     * 删除公司
     *
     * @param companyId
     * @return
     */
    Integer deleteByKey(Integer companyId);

    void deleteAllCompanyAndAreasCatch();

}
